{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[10,4], [8,3], [3,6], [2,8], [2,2], [5,2], [9,3], [7,4], [8,2], [7,3]])\n",
    "\n",
    "Y = np.array([0, 0, 1, 1, 1, 0, 0, 0, 0 ,0])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-6 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-6 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-6 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-6 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-6 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-6 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-6 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-6 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-6 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-6 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-6 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-6 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-6 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-6\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" checked><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# TODO\n",
    "knn.fit(X, Y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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4OHhgR07dug6DCXGxnknK+/enfcnD2kRERFVbjrf00NERERUHlj0EBERkUFg0UNEREQGgUUPERERGQQWPURERGQQWPQQERGRQWDRQ0RERAaBRQ8REREZBBY9REREZBBY9BAREZFBYNFDREREBoFFDxERERkEFj1ERERkEFj0EBERkUFg0UNEREQGgUUPERERGQQWPURERGQQWPQQERGRQWDRQ0RERAaBRQ8REREZBBY9REREZBBY9BAREZFBYNFDREREBoFFDxERERkEFj1ERERkEFj0EBERkUFg0UNEREQGgUUPERERGQQWPURERGQQWPQQERGRQWDRQ0RERAaBRQ8REREZBBY9REREZBBY9BAREZFBYNFDREREBoFFDxERERkEFj1ERERkEFj0EBERkUFg0UNEREQGgUUPERERGQQWPURERGQQWPQQERGRQWDRQ0RERAaBRQ8REREZBJ0XPatXr4ZEIinyJyIiQtfhERERkZ4w0XUA77//Pry8vJTaTpw4gQ8//BD9+/fXUVRERESkb3Re9NjY2MDGxkapLTw8HD169EDNmjV1FBURERHpG50XPQU9e/YMGzduxB9//KHrUIiIiEiPVLii57fffkPVqlXRo0ePYvtkZmYiMzNT8VomkwEA5HI55HK5xmLJH0uTY1Yk+p4foP856nt+gP7nyPwqP33PUZv5lfc2kwghRLmu8TWaNm2KPn36YMaMGcX2CQsLQ3h4eKH2devWwdLSUpvhERERkYakpaVh0KBBSElJga2trdbXV6GKnhMnTsDLywsJCQmoXbt2sf2K2tPj4uKCpKQkjW40uVyO/fv3w8/PD6amphobt6LQ9/wA/c9R3/MD9D9H5lf56XuO2sxPJpPB0dGx3IqeCnV4a9myZejcuXOJBQ8ASKVSSKXSQu2mpqZamXDaGrei0Pf8AP3PUd/zA/Q/R+ZX+el7jtrIr7y3V4UpelJSUvDHH39g1apVug6FiIiI9JDOb06Yb+3atbCyssJ7772n61CIiIhID1WYomf58uUYOnQozMzMdB0KERER6aEKc3jr0qVLug6BiIiI9FiF2dNDREREpE0seoiIiMggsOghIiIig8Cih4iIiAwCix4iIiIyCCx6iIiIyCCw6CEiIiKDwKKHiIiIDAKLHiIiIjIILHqIiIjIILDoISIiIoPAooeIiIgMAoseIiIi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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "#TODO\n",
    "plt.scatter(X[Y==0][:,0], X[Y==0][:,1], c='r')\n",
    "plt.scatter(X[Y==1][:,0], X[Y==1][:,1], c='b')\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "#TODO\n",
    "plt.plot(new_user[0,0], new_user[0,1], 'rx', markersize=8)\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = np.array(X[idx[0][0]]) # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([nearest[0], new_user[0][0]], [nearest[1], new_user[0][1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.15"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
